home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / RCS / Misc_InvokeEditor.c,v < prev    next >
Text File  |  1991-06-04  |  3KB  |  142 lines

  1. head     1.2;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.2
  10. date     91.06.03.22.16.16;  author kupfer;  state Exp;
  11. branches ;
  12. next     1.1;
  13.  
  14. 1.1
  15. date     91.06.03.21.41.36;  author kupfer;  state Exp;
  16. branches ;
  17. next     ;
  18.  
  19.  
  20. desc
  21. @Misc_InvokeEditor library function.
  22. @
  23.  
  24.  
  25. 1.2
  26. log
  27. @Add protection in case we're invoked by a setuid or setgid program.
  28. @
  29. text
  30. @/* 
  31.  * InvokeEditor.c --
  32.  *
  33.  *    Source for the Misc_InvokeEditor library function.
  34.  *
  35.  * Copyright 1991 Regents of the University of California
  36.  * Permission to use, copy, modify, and distribute this
  37.  * software and its documentation for any purpose and without
  38.  * fee is hereby granted, provided that this copyright
  39.  * notice appears in all copies.  The University of California
  40.  * makes no representations about the suitability of this
  41.  * software for any purpose.  It is provided "as is" without
  42.  * express or implied warranty.
  43.  */
  44.  
  45. #ifndef lint
  46. static char rcsid[] = "$Header: /sprite/src/lib/c/etc/RCS/InvokeEditor.c,v 1.1 91/06/03 21:41:36 kupfer Exp Locker: kupfer $ SPRITE (Berkeley)";
  47. #endif /* not lint */
  48.  
  49. #include <errno.h>
  50. #include <libc.h>
  51. #include <stddef.h>
  52. #include <stdio.h>
  53. #include <stdlib.h>
  54. #include <string.h>
  55. #include <sys/types.h>
  56. #include <sys/wait.h>
  57. #include <unistd.h>
  58.  
  59.  
  60. /*
  61.  *----------------------------------------------------------------------
  62.  *
  63.  * Misc_InvokeEditor --
  64.  *
  65.  *    Invoke the user's editor on the given file.
  66.  *
  67.  * Results:
  68.  *    Returns the exit status from the editor.
  69.  *
  70.  * Side effects:
  71.  *    Typically the user edits the named file.  Of course, once the 
  72.  *    user is in the editor, she can do whatever the editor will let 
  73.  *    her get away with.
  74.  *
  75.  *----------------------------------------------------------------------
  76.  */
  77.  
  78. int
  79. Misc_InvokeEditor(file)
  80.     char *file;            /* name of file to edit */
  81. {
  82.     int pid, w;
  83.     union wait status;
  84.     char *name;            /* simple name of the editor */
  85.     char *editorPath;        /* path to the editor */
  86.     
  87.     editorPath = getenv("EDITOR");
  88.     if (editorPath != NULL ) {
  89.     name = rindex(editorPath, '/');
  90.     if (name != NULL) {
  91.         ++name;
  92.     } else {
  93.         name = editorPath;
  94.     }
  95.     } else {
  96.     name = editorPath = "vi";
  97.     }
  98.  
  99.     pid = vfork();
  100.     if (pid < 0) {
  101.     perror("Can't fork editor");
  102.     return 1;
  103.     } else if (pid == 0) {
  104.     /* 
  105.      * Make sure we don't give the user an editor with a protected 
  106.      * user ID.
  107.      */
  108.     if (getuid() != geteuid()) {
  109.         (void)seteuid(getuid());
  110.     }
  111.     if (getgid() != getegid()) {
  112.         (void)setegid(getgid());
  113.     }
  114.     if (strcmp(name, "mx") == 0) {
  115.         execlp(editorPath, name, "-D", file, NULL);
  116.     } else {
  117.         execlp(editorPath, name, file, NULL);
  118.     }
  119.     (void)fprintf(stderr, "Can't start %s: %s\n", editorPath,
  120.               strerror(errno));
  121.     _exit(127);
  122.     }
  123.     while ((w = wait(&status)) != pid && w != -1) {
  124.     ;
  125.     }
  126.     return(w == -1 || status.w_retcode);
  127. }
  128. @
  129.  
  130.  
  131. 1.1
  132. log
  133. @Initial revision
  134. @
  135. text
  136. @d17 1
  137. a17 1
  138. static char rcsid[] = "$Header: /sprite/lib/forms/RCS/proto.c,v 1.5 91/02/09 13:24:44 ouster Exp $ SPRITE (Berkeley)";
  139. d26 1
  140. d75 10
  141. @
  142.